﻿// ConsoleApplication2.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <graphics.h>
#include <conio.h>
#include <math.h>
#include <time.h>

// 粒子结构体
typedef struct {
    double x;      // X坐标
    double y;      // Y坐标
    double vx;     // X方向速度
    double vy;     // Y方向速度
    int r;         // 粒子半径
    COLORREF color;// 粒子颜色
    int life;      // 粒子生命周期
} Particle;

#define MAX_PARTICLES 1000  // 最大粒子数量
Particle particles[MAX_PARTICLES];  // 粒子数组
int particleCount = 0;              // 当前粒子数量

// 生成爱心曲线上的点（极坐标公式）
void getHeartPoint(double t, double* x, double* y) {
    double angle = t * 3.1415926 / 180;
    *x = 16 * pow(sin(angle), 3);
    *y = 13 * cos(angle) - 5 * cos(2 * angle) - 2 * cos(3 * angle) - cos(4 * angle);
    // 缩放并平移到窗口中心
    *x = *x * 10 + 400;
    *y = -(*y) * 10 + 300;  // 负号反转Y轴（图形库Y轴向下）
}

// 初始化粒子
void initParticle(double x, double y) {
    if (particleCount >= MAX_PARTICLES) return;
    Particle* p = &particles[particleCount++];

    p->x = x;
    p->y = y;
    // 随机速度（向爱心外侧扩散）
    p->vx = (rand() % 20 - 10) / 5.0;
    p->vy = (rand() % 20 - 10) / 5.0;
    p->r = rand() % 3 + 1;  // 粒子半径1-3像素
    // 随机粉色系颜色
    p->color = RGB(255, rand() % 100 + 155, rand() % 155 + 100);
    p->life = rand() % 60 + 40;  // 生命周期40-100帧
}

// 更新并绘制粒子
void updateAndDrawParticles() {
    int i;
    for (i = 0; i < particleCount; i++) {
        Particle* p = &particles[i];

        // 更新位置（加入重力效果）
        p->x += p->vx;
        p->y += p->vy;
        p->vy += 0.05;  // 模拟重力，Y方向加速

        // 绘制粒子
        setfillcolor(p->color);
        solidcircle((int)p->x, (int)p->y, p->r);

        // 减少生命周期，移除死亡粒子
        p->life--;
        if (p->life <= 0) {
            // 用最后一个粒子覆盖当前粒子，减少数组元素
            particles[i] = particles[--particleCount];
            i--;  // 重新检查当前位置
        }
    }
}

int main() {
    initgraph(800, 600);  // 初始化800x600图形窗口
    setbkcolor(0x000000);  // 黑色背景
    srand((unsigned int)time(NULL));  // 初始化随机数种子

    double t = 0;  // 爱心曲线参数
    while (!_kbhit()) {  // 按任意键退出
        cleardevice();  // 清空屏幕

        // 生成爱心轮廓的粒子（每帧在曲线上生成2个粒子）
        double x1, y1, x2, y2;
        getHeartPoint(t, &x1, &y1);
        getHeartPoint(t + 180, &x2, &y2);  // 对称点
        initParticle(x1, y1);
        initParticle(x2, y2);

        // 更新并绘制所有粒子
        updateAndDrawParticles();

        t += 2;  // 递增参数，让爱心轮廓移动
        if (t >= 360) t = 0;

        Sleep(15);  // 控制帧率（约66帧/秒）
    }

    closegraph();  // 关闭图形窗口
    return 0;
}
// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件，或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来，若要再次打开此项目，请转到“文件”>“打开”>“项目”并选择 .sln 文件
